package com.wzh.codegen.biz.service;

import com.wzh.codegen.biz.domain.dto.CodegenServiceDTO;
import com.wzh.codegen.biz.domain.dto.CodegenTableDTO;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;

import java.util.List;
import java.util.Map;

/**
 * 代码生成服务接口
 *
 * @author wzh
 * @since 2024-01-01
 */
public interface CodegenService {

    /**
     * 生成微服务代码
     *
     * @param dto 服务生成参数
     * @return 生成结果
     */
    String generateService(CodegenServiceDTO dto);

    /**
     * 下载微服务代码压缩包
     *
     * @param dto 服务生成参数
     * @return 文件资源
     */
    ResponseEntity<Resource> downloadService(CodegenServiceDTO dto);

    /**
     * 生成数据库表代码
     *
     * @param dto 表生成参数
     * @return 生成结果
     */
    String generateTable(CodegenTableDTO dto);

    /**
     * 下载表代码压缩包
     *
     * @param dto 表生成参数
     * @return 文件资源
     */
    ResponseEntity<Resource> downloadTable(CodegenTableDTO dto);

    /**
     * 同步数据库表结构
     *
     * @param datasourceId 数据源ID
     * @param tableName    表名
     */
    void syncTable(Long datasourceId, String tableName);

    /**
     * 同步代码
     *
     * @param dto 表生成参数
     */
    void syncCode(CodegenTableDTO dto);

    /**
     * 获取数据库表列表
     *
     * @param datasourceId 数据源ID
     * @return 表列表
     */
    List<Map<String, Object>> getTables(Long datasourceId);

    /**
     * 获取表字段信息
     *
     * @param datasourceId 数据源ID
     * @param tableName    表名
     * @return 字段列表
     */
    List<Map<String, Object>> getColumns(Long datasourceId, String tableName);

    /**
     * 创建数据库表
     *
     * @param dto 表生成参数
     */
    void createTable(CodegenTableDTO dto);

    /**
     * 生成实体类代码
     */
    String generateEntity(CodegenTableDTO tableDTO);

    /**
     * 生成SQL代码
     */
    String generateSql(CodegenTableDTO tableDTO);

    /**
     * 生成Mapper代码
     */
    String generateMapper(CodegenTableDTO tableDTO);

    /**
     * 生成Service代码
     */
    String generateServiceCode(CodegenTableDTO tableDTO);

    /**
     * 生成Controller代码
     */
    String generateController(CodegenTableDTO tableDTO);

    /**
     * 生成DTO代码
     */
    String generateDTO(CodegenTableDTO tableDTO);

    /**
     * 生成ServiceImpl代码
     */
    String generateServiceImpl(CodegenTableDTO tableDTO);

    /**
     * 同步表结构
     */
    List<Map<String, Object>> syncTableStructure(Long datasourceId, Long tableId);


    /**
     * 获取通用字段
     *
     */
    List<Map<String, Object>> getCommonFields();

}